package com.cdu.util;

import org.springframework.cglib.beans.BeanCopier;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * projectName : app3_spring2ibatis
 * className: LogAsync
 * description: BeanCopy , 方便后续与持久层交互的时候实例对象的值copy；
 *
 * @author : git.jas0nch
 * date: 2022-03-28
 */
public class BeanCopyUtils {

    // 创建过的BeanCopier实例放到缓存中，下次可以直接获取，提升性能
    private static final Map<String, org.springframework.cglib.beans.BeanCopier> BEAN_COPIERS = new ConcurrentHashMap<>();

    /**
     * 对象拷贝，类型和属性名称相同并且存在setter方法可以拷贝（lombok 注解@Acc溜ors(chain = true)//其无法复制;）
     */
    public static void copy(Object srcObj, Object destObj) {
        String key = genKey(srcObj.getClass(), destObj.getClass());
        org.springframework.cglib.beans.BeanCopier copier;
        if (!BEAN_COPIERS.containsKey(key)) {
            copier = BeanCopier.create(srcObj.getClass(), destObj.getClass(), false);
            BEAN_COPIERS.put(key, copier);
        } else {
            copier = BEAN_COPIERS.get(key);
        }
        copier.copy(srcObj, destObj, null);
    }

    private static String genKey(Class<?> srcClazz, Class<?> destClazz) {
        return srcClazz.getName() + destClazz.getName();
    }
}